/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package at.irian.demo.jsfatwork.view.validation;

import at.gp.web.jsf.extval.config.java.AbstractExtValModule;
import at.gp.web.jsf.extval.config.java.ExtValModuleRegistry;
import at.irian.demo.jsfatwork.application.validation.Before;
import at.irian.demo.jsfatwork.application.validation.NotEquals;
import at.irian.demo.jsfatwork.domain.validation.Severity;
import org.apache.myfaces.extensions.validator.beanval.payload.ViolationSeverity;
import org.apache.myfaces.extensions.validator.core.ExtValContext;
import org.apache.myfaces.extensions.validator.core.startup.AbstractStartupListener;

/**
 * @author Gerhard Petracek
 */
public class ExtValStartupListener extends AbstractStartupListener
{
    private static final long serialVersionUID = -6010808099039360674L;

    protected void init()
    {
        registerBeanValidationCustomSeverities();

        addValidationModules();
    }

    /**
     * Illustrates the usage of the java-config add-on for ExtVal as alternative to naming conventions
     */
    private void addValidationModules()
    {
        ExtValModuleRegistry.startConfig().modules(
                new DomainValidationModule(),
                new ApplicationValidationModule()).endConfig();
    }

    class DomainValidationModule extends AbstractExtValModule
    {
        protected void configure()
        {
            bind(NotEqualsValidationAdapter.class).to(NotEquals.class, DefaultMessageResolver.class);
        }
    }

    class ApplicationValidationModule extends AbstractExtValModule
    {
        protected void configure()
        {
            bind(BeforeValidator.class).to(Before.class, DefaultMessageResolver.class);
        }
    }

    /**
     * Illustrates the mapping of custom payload to keep the model independent of ExtVal
     */
    private void registerBeanValidationCustomSeverities()
    {
        ExtValContext extValContext = ExtValContext.getContext();

        extValContext.addGlobalProperty(ViolationSeverity.Info.class.getName(), Severity.Info.class);
        extValContext.addGlobalProperty(ViolationSeverity.Warn.class.getName(), Severity.Warn.class);
        extValContext.addGlobalProperty(ViolationSeverity.Error.class.getName(), Severity.Error.class);
        extValContext.addGlobalProperty(ViolationSeverity.Fatal.class.getName(), Severity.Fatal.class);
    }
}
